package displayboardinfo.messages;

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

import org.hibernate.Hibernate;

import displayboardinfo.entities.Visit;

/**
 * Odpowiedź usługi listowania wizyt danego gabinetu danego dnia.
 * Zobacz również: {@link displayboardinfo.services.VisitsServices#list(javax.xml.bind.JAXBElement)}}
 * 
 * @author Artur Jaworski
 */
@XmlRootElement
public class ListVisitsRes {
	
	private ArrayList<Visit> visits;
	
	/**
	 * Domyślny konstruktor bezargumentowy.
	 */
	public ListVisitsRes() {
		setVisits(new ArrayList<Visit>());
	}
	
	/**
	 * Pobranie listy wizyt w danym gabinecie danego dnia.
	 * 
	 * @return lista wizyt w danym gabinecie danego dnia
	 */
	@XmlElementWrapper ( name = "visits" )
	@XmlElement ( name = "visit" )
	public ArrayList<Visit> getVisits() {
		return visits;
	}

	/**
	 * Ustawienie listy wizyt w danym gabinecie danego dnia.
	 * Pojedyncze wizyty należy dodawać używając metody {@link #addVisit(Visit)}
	 * 
	 * @param visits lista wizyt w danym gabinecie danego dnia
	 */
	public void setVisits(ArrayList<Visit> visits) {
		this.visits = visits;
	}
	
	/**
	 * Dodanie pojedynczej wizyty do listy wizyt.
	 * W celu uniknięcia odwołań cyklicznych zerowane są następujące pola:
	 * <ul>
	 * <li> {@link Visit#getRoom()}: visits, registeredForUpdates, users, admissions </li>
	 * <li> {@link Visit#getPatient()}: visits </li>
	 * </ul>
	 * 
	 * @param visit wizyta dodawany do listy
	 */
	public void addVisit(Visit visit){
		Hibernate.initialize(visit);
		
		Hibernate.initialize(visit.getRoom());
		visit.getRoom().setVisits(null);
		visit.getRoom().setRegisteredForUpdates(null);
		visit.getRoom().setUsers(null);
		visit.getRoom().setAdmissions(null);
		
		Hibernate.initialize(visit.getPatient());
		visit.getPatient().setVisits(null);
		
		this.visits.add(visit);
	}
	
}
